#include <iostream>
using namespace std;
/**
 * 基本数据类型转换
 */
int main() {
  //  1. 浮点型转整型，即整型 = 浮点型
  // 直接去掉小数点后的内容只保留整数部分即可(需要保证整型空间大小能够接收，比如float和int都是32位，long long和double都是64位)
  cout << "浮点型转整型" << endl;
  int a = 100.9f;
  long long b = -100000000000.999;
  cout << a << endl;
  cout << b << endl;

  // 2. 浮点型（double）转浮点型（float）
  // 将会出现精度损失
  float c = 123.456789f;
  cout << fixed;
  cout.precision(10);
  cout << c << endl;

  // 3. 整型转浮点型
  // 一般来说精准转换，但是当整数大于2^24次方时float不再精准，当整数大于2^53次方时double不再精准
  int i = 123;
  float f = i;
  cout << f << endl;

  // 4. 整型转整型
  // 大整型往小整型转则只保留固定位数
  // 小整型转大整型，不够大位用0补充

  // 5. 强制类型转换
  // 另外C++提供了四个cast转换，更加灵活
  double d = 3.14;
  cout << (int)d << " " << int(d) << endl;

  // 6. 算术转换
  // bool char short(unsigned short) int (unsigned int) long long  (unsigned long long) float double
  // bool + char -> int + int
  // char + short -> int + int
  // short + int -> int + int
  
  // int + long long -> long long + long long
  // long long + float -> float + float
  // double + int -> double + double 

  // int x = 'A'; -> int x = (int)('A') -> int x = 65;
  // char c = 'A' + 1; -> char c = (int)('A') + 1 -> char c = (char)(66);
  // 10 + true -> 10 + 1 
  // 1.0 * 5 / 2 -> 1.0 * 5.0 / 2 -> 5.0 / 2.0
  // while(1) -> while (true)

  return 0;
}